/*
 * ppmc.c
 *
 *  Created on: 10/06/2012
 *      Author: damnvb
 */


#include <stdio.h>
#include <stdlib.h>



typedef struct aritmetico{
	float piso;
	float techo;
	float archivo_comprimido;
    char filename[256];

}aritmetico;

aritmetico un_aritmetico;

/*
void adaptar_modelo(aritmetico *un_aritmetico,char modelo[],int frec_modelo[], char caracter){
	int piso_en_modelo,frec_char,frecuencia=0;
	float nuevo_piso,nuevo_techo;
	int i=0;
	int cant_letras=10;
	while (i<cant_letras){
		if (modelo[i]==caracter){
			piso_en_modelo=frecuencia;
			frec_char=frec_modelo[i];
		}
		frecuencia+=frec_modelo[i];
		i=i+1;
	}
	float techomenospiso=un_aritmetico->techo-un_aritmetico->piso;
	nuevo_piso=((techomenospiso)/frecuencia)*piso_en_modelo + un_aritmetico->piso;
	nuevo_techo=nuevo_piso + ((techomenospiso)/frecuencia)*frec_char;
	un_aritmetico->piso=nuevo_piso;
	un_aritmetico->techo=nuevo_techo;
	printf("%f %f ",nuevo_piso,nuevo_techo);
	}
*/

	/*
void comprimir(aritmetico *un_aritmetico,int frec_modelo[],int pos_char_modelo, int frec_total){
	int piso_en_modelo,frec_piso=0,frec_techo;
	float nuevo_piso,nuevo_techo;
	int i=0;
	int cant_letras=10;
	while(i<pos_char_modelo){
		frec_piso+=frec_modelo[i];
		i+=1;
	}
	frec_techo=frec_piso+frec_modelo[pos_char_modelo];
	float techomenospiso=un_aritmetico->techo-un_aritmetico->piso;
	nuevo_piso=((techomenospiso)/frec_total)*frec_piso + un_aritmetico->piso;
	nuevo_techo=nuevo_piso + ((techomenospiso)/frec_total)*frec_modelo[pos_char_modelo];
	un_aritmetico->piso=nuevo_piso;
	un_aritmetico->techo=nuevo_techo;
	printf("%f %f ",nuevo_piso,nuevo_techo);
	}
}
*/

int comprimirPPMC(aritmetico *un_aritmetico,int frec_modelo[],char caracter){
	int frec_piso,frec_techo,frec_total=0,i=0;
	float nuevo_piso,nuevo_techo;
	int estado=0;
	int caracter_pivote=caracter;
	while (i<258){
		if(frec_modelo[i]!=0){
			if(i==caracter_pivote){
				frec_piso=frec_total;
				frec_techo=frec_total+frec_modelo[i];
				estado=0; //se comprime un caracter
			}
			frec_total+=frec_modelo[i];
		}
		else{
			if(i==caracter_pivote){
				estado=1;//fue escape
				caracter_pivote=256; //cambio el caracter a comprimir, el cual va a ser el escape
			}

		}
			i+=1;


	}
	float techomenospiso=un_aritmetico->techo-un_aritmetico->piso;
	nuevo_piso=((techomenospiso)/frec_total)*frec_piso + un_aritmetico->piso;
	nuevo_techo=nuevo_piso + ((techomenospiso)/frec_total)*frec_modelo[(int)caracter];
	un_aritmetico->piso=nuevo_piso;
	un_aritmetico->techo=nuevo_techo;
	printf("Nuevo piso,techo :");
	printf("(%f , %f) ",nuevo_piso,nuevo_techo);
	return estado;
}

char descomprimir(aritmetico *un_aritmetico,int frec_modelo[],float nro_archivo){
	float x=un_aritmetico->piso;
	int frecuencia=0, i=0;
	//esto se lo puede ahorrar con la funcion info_modelo, que da el numero total de frecs
	while (i<258){
			frecuencia+=frec_modelo[i];
			i=i+1;
	}
	int j=0;
	float techomenospiso=un_aritmetico->techo - un_aritmetico->piso;
	while (nro_archivo>x){
		x=x+(frec_modelo[j]*techomenospiso/frecuencia);
		j=j+1;

	}
	char xi=(char)j-1;
	printf(" emite (%c) ",xi);
	//adaptar(un_aritmetico,frec_modelo,j-1);
	int estado=comprimirPPMC(un_aritmetico,frec_modelo,j-1);
	if(estado==1){
		//fue ESC
//		return; 												TODO Comentado Damian 10-jun (No compilaba)
	}
	else if(estado==0){
		//fue char
		return (char)(j-1);
	}
	else{
		printf("Fin descompresion");
	}
}


int mainPPMC(){
	int modelo[258];
	//lleno de 0(ceros) las posiciones no correspondientes a "abcde", y de 1(unos) a las demas
	int i=0;
	while(i<97){
			modelo[i]=0;
			i+=1;
	}
	while (i<102){
		modelo[i]=1;
		i+=1;
	}
	while (i<258){
		modelo[i]=0;
		i+=1;
	}
	aritmetico *un_aritmetico=malloc(sizeof(aritmetico));
	un_aritmetico->piso=0.0;
	un_aritmetico->techo=10000.0;

	//Etapa compresion
	int j=97;
	int estado;
	while(j<102){
			estado=comprimirPPMC(un_aritmetico,modelo,j);
		//adaptar(un_aritmetico,modelo,j);
			j=j+1;
	}
	printf("Piso final: %f - Techo final: %f ",un_aritmetico->piso,un_aritmetico->techo);

	un_aritmetico->piso=0.0;
	un_aritmetico->techo=10000.0;

	//Etapa descompresion
	int w=0;
	while(w<5){
		descomprimir(un_aritmetico,modelo,623.0); //tomo como nro de archivo a 623.0
		w=w+1;
	}
	return 0;
}

